WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ์ ์ธ๊ณ ํ๋ซํผ์์ ์๋ง์ ์ค๋ณต ๊ฐ์ฒด๋ฅผ ํ์ํ ์ฑ๋ฅ์ผ๋ก ๋ ๋๋งํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ, ์ด์ , ๊ตฌํ ๋ฐ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํ๊ตฌํฉ๋๋ค.
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ: ๊ธ๋ก๋ฒ ๊ฒฝํ์ ์ํ ํจ์จ์ ์ธ ์ค๋ณต ๊ฐ์ฒด ๋ ๋๋ง ๊ธฐ๋ฒ
ํ๋ ์น ๊ฐ๋ฐ์ ๊ดํํ ํ๊ฒฝ์์, ๋งค๋ ฅ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ 3D ๊ฒฝํ์ ๋ง๋๋ ๊ฒ์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ๋ชฐ์ ํ ๊ฒ์๊ณผ ๋ณต์กํ ๋ฐ์ดํฐ ์๊ฐํ๋ถํฐ ์์ธํ ๊ฑด์ถ ์๋ฎฌ๋ ์ด์ ๋ฐ ์ธํฐ๋ํฐ๋ธ ์ ํ ๊ตฌ์ฑ๊ธฐ์ ์ด๋ฅด๊ธฐ๊น์ง, ํ๋ถํ ์ค์๊ฐ ๊ทธ๋ํฝ์ ๋ํ ์์๋ ๊ณ์ํด์ ์น์๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํํ ๋ฐ์ํ๋ ๊ณผ์ ๋ ์๋ง์ ๋์ผํ๊ฑฐ๋ ๋งค์ฐ ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์์ฒ ๊ทธ๋ฃจ์ ๋๋ฌด๊ฐ ์๋ ์ฒ, ์๋ง์ ๊ฑด๋ฌผ์ด ์ฆ๋นํ ๋์, ๋๋ ์๋ฐฑ๋ง ๊ฐ์ ๊ฐ๋ณ ์์๋ก ๊ตฌ์ฑ๋ ํํฐํด ์์คํ ์ ์๊ฐํด๋ณด์ญ์์ค. ์ ํต์ ์ธ ๋ ๋๋ง ์ ๊ทผ ๋ฐฉ์์ ์ข ์ข ์ด๋ฌํ ๋ถํ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ์ฌ ๋๋ฆฐ ํ๋ ์ ์๋์ ์ต์ ์ด ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํ๋ฉฐ, ์ด๋ ๋ค์ํ ํ๋์จ์ด ์ฑ๋ฅ์ ๊ฐ์ง ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ํนํ ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ก ์ด ์ง์ ์์ WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ด ํ์ ์ ์ธ ๊ธฐ๋ฒ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ์ธ์คํด์ฑ์ ๊ฐ๋ฐ์๊ฐ ๋จ ํ ๋ฒ์ ๋๋ก์ฐ ์ฝ(draw call)๋ก ๋์ผํ ๊ธฐํํ์ ๋ฐ์ดํฐ์ ๋ง์ ๋ณต์ฌ๋ณธ์ ๋ ๋๋งํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ GPU ๊ธฐ๋ฐ ์ต์ ํ์ ๋๋ค. CPU์ GPU ๊ฐ์ ํต์ ์ค๋ฒํค๋๋ฅผ ๊ทน์ ์ผ๋ก ์ค์์ผ๋ก์จ, ์ธ์คํด์ฑ์ ์ ๋ก ์๋ ์ฑ๋ฅ์ ๋ฐํํ๊ฒ ํ์ฌ, ๊ณ ์ฌ์ ์ํฌ์คํ ์ด์ ๋ถํฐ ๋ณด๊ธํ ๋ชจ๋ฐ์ผ ์ฅ์น์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ๊ธฐ๊ธฐ์์ ์ํํ๊ฒ ์คํ๋๋ ๋ฐฉ๋ํ๊ณ ์์ธํ๋ฉฐ ๋งค์ฐ ๋์ ์ธ ์ฅ๋ฉด์ ๋ง๋ค ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ณ ๋งค๋ ฅ์ ์ธ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ค ๊ฒ์ ๋๋ค. ์ด ๊ธฐ์ ์ด ํด๊ฒฐํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ค์ ํ๊ตฌํ๊ณ , ํต์ฌ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ฉฐ, ์ค์ ๊ตฌํ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๊ณ , ๊ณ ๊ธ ๊ธฐ๋ฒ์ ๋ํด ๋ ผ์ํ๋ฉฐ, ๋ค์ํ ์ฐ์ ๋ถ์ผ์์์ ์ฌ์คํ ์ด์ ๊ณผ ๋ค์ํ ์์ฉ ์ฌ๋ก๋ฅผ ์กฐ๋ช ํ ๊ฒ์ ๋๋ค. ์๋ จ๋ ๊ทธ๋ํฝ์ค ํ๋ก๊ทธ๋๋จธ๋ WebGL์ ์ฒ์ ์ ํ๋ ์ฌ๋์ด๋ , ์ด ๊ธ์ ์ธ์คํด์ฑ์ ํ์ ํ์ฉํ์ฌ ์น ๊ธฐ๋ฐ 3D ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก์ด ์ฐจ์์ ํจ์จ์ฑ๊ณผ ์๊ฐ์ ์ถฉ์ค๋๋ก ๋์ด์ฌ๋ฆด ์ ์๋ ์ง์์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๋ ๋๋ง ๋ณ๋ชฉ ํ์: ์ธ์คํด์ฑ์ด ์ค์ํ ์ด์
์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ํ์ ์ง์ ์ผ๋ก ์ดํดํ๋ ค๋ฉด, ์ ํต์ ์ธ 3D ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ด์ฌ๋ ๋ณ๋ชฉ ํ์์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ค ํ ๋, ๋น๋ก ๊ธฐํํ์ ์ผ๋ก ๋์ผํ๋๋ผ๋, ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ ๊ฐ์ฒด์ ๋ํด ๋ณ๋์ "๋๋ก์ฐ ์ฝ"์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋๋ก์ฐ ์ฝ์ CPU๊ฐ GPU์๊ฒ ๊ธฐ๋ณธ ๋ํ(์ผ๊ฐํ, ์ , ์ )์ ๋ฐฐ์น๋ฅผ ๊ทธ๋ฆฌ๋๋ก ์ง์ํ๋ ๋ช ๋ น์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ ๊ณ ๋ คํด ๋ณด์ญ์์ค:
- CPU-GPU ํต์ ์ค๋ฒํค๋: ๊ฐ ๋๋ก์ฐ ์ฝ์ ์ผ์ ๋์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํต๋๋ค. CPU๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ณ , ๋ ๋๋ง ์ํ(์ ฐ์ด๋, ํ ์ค์ฒ, ๋ฒํผ ๋ฐ์ธ๋ฉ)๋ฅผ ์ค์ ํ ๋ค์, GPU์ ๋ช ๋ น์ ๋ด๋ ค์ผ ํฉ๋๋ค. ์์ฒ ๊ฐ์ ๊ฐ์ฒด์ ๋ํด ์ด๋ฌํ CPU์ GPU ๊ฐ์ ๋์์๋ ํต์ ์ CPU๋ฅผ ๋น ๋ฅด๊ฒ ํฌํ ์ํ๋ก ๋ง๋ค์ด, GPU๊ฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ์๋ํ๊ธฐ๋ ์ ์ ์ฃผ๋ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ์ข ์ข "CPU ๋ฐ์ด๋(CPU-bound)" ์ํ๋ผ๊ณ ํฉ๋๋ค.
- ์ํ ๋ณ๊ฒฝ: ๋๋ก์ฐ ์ฝ ์ฌ์ด์ ๋ค๋ฅธ ์ฌ์ง, ํ ์ค์ฒ ๋๋ ์ ฐ์ด๋๊ฐ ํ์ํ ๊ฒฝ์ฐ, GPU๋ ๋ด๋ถ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ์ ์ฆ๊ฐ์ ์ด์ง ์์ผ๋ฉฐ ์ถ๊ฐ์ ์ธ ์ง์ฐ์ ์ ๋ฐํ์ฌ ์ ๋ฐ์ ์ธ ๋ ๋๋ง ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ค๋ณต: ์ธ์คํด์ฑ์ด ์๋ค๋ฉด, 1000๊ทธ๋ฃจ์ ๋์ผํ ๋๋ฌด๊ฐ ์์ ๋ 1000๊ฐ์ ์ ์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ GPU ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ํ๋ ์์ง์ ์ด๋ณด๋ค ๋๋ํ์ง๋ง, ๊ฐ ์ธ์คํด์ค์ ๋ํ ๊ฐ๋ณ ๋ช ๋ น์ ๊ด๋ฆฌํ๊ณ ๋ณด๋ด๋ ๊ฐ๋ ์ ์ค๋ฒํค๋๋ ์ฌ์ ํ ๋จ์ ์์ต๋๋ค.
์ด๋ฌํ ์์ธ๋ค์ ๋์ ํจ๊ณผ๋ก ์ธํด, ๋ณ๋์ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํ์ฌ ์์ฒ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ฉด ํนํ CPU ์ฑ๋ฅ์ด ๋ฎ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ด ์ ํ๋ ์ฅ์น์์ ๋งค์ฐ ๋ฎ์ ํ๋ ์ ์๋๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ค์ํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๋์์ผ๋ก ํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ด ์ฑ๋ฅ ๋ฌธ์ ๋ ๋์ฑ ์ค์ํด์ง๋๋ค. ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ๋ง์ ๋๋ก์ฐ ์ฝ์ ํ๋๋ก ํตํฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํจ์ผ๋ก์จ CPU์ ์์ ๋ถํ๋ฅผ ๋ํญ ์ค์ด๊ณ GPU๊ฐ ๋ ํจ์จ์ ์ผ๋ก ์๋ํ๋๋ก ํฉ๋๋ค.
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ด๋ ๋ฌด์์ธ๊ฐ?
ํต์ฌ์ ์ผ๋ก, WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ GPU๊ฐ ๋จ์ผ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํ์ฌ ๋์ผํ ์ ์ ์งํฉ์ ์ฌ๋ฌ ๋ฒ ๊ทธ๋ฆฌ๋, ๊ฐ "์ธ์คํด์ค"์ ๋ํด ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ํ๋ ๊ธฐ์ ์ ๋๋ค. ๊ฐ ๊ฐ์ฒด์ ๋ํ ์ ์ฒด ๊ธฐํํ์ ๊ตฌ์กฐ์ ๋ณํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ณด๋ด๋ ๋์ , ๊ธฐํํ์ ๋ฐ์ดํฐ๋ ํ ๋ฒ๋ง ๋ณด๋ด๊ณ , ๊ทธ ๋ค์ ์์น, ํ์ , ํฌ๊ธฐ ๋๋ ์์๊ณผ ๊ฐ์ด ์ธ์คํด์ค๋ณ๋ก ๋ค๋ฅธ ๋ณ๋์ ์์ ๋ฐ์ดํฐ ์งํฉ์ ์ ๊ณตํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์์ต๋๋ค:
- ์ธ์คํด์ฑ ์์ ๋: ์ฟ ํค 1000๊ฐ๋ฅผ ๊ตฝ๋๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๊ฐ ์ฟ ํค๋ง๋ค ๋ฐ์ฃฝ์ ๋ฐ๊ณ , ๊ฐ์ ์ฟ ํค ์ปคํฐ๋ก ์๋ฅด๊ณ , ํธ๋ ์ด์ ๋๊ณ , ๊ฐ๋ณ์ ์ผ๋ก ์ฅ์ํ ๋ค์ ์ค๋ธ์ ๋ฃ์ต๋๋ค. ์ด๋ ๋ฐ๋ณต์ ์ด๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์ ์ ๋๋ค.
- ์ธ์คํด์ฑ ์์ ๋: ํฐ ๋ฐ์ฃฝ ์ํธ๋ฅผ ํ ๋ฒ๋ง ๋ฐ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ์ ์ฟ ํค ์ปคํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ฃฝ์ ๋ค์ ์ค๋นํ ํ์ ์์ด 1000๊ฐ์ ์ฟ ํค๋ฅผ ๋์์ ๋๋ ๋น ๋ฅด๊ฒ ์ฐ์ํด์ ์๋ผ๋ ๋๋ค. ๊ฐ ์ฟ ํค๋ ์ฝ๊ฐ ๋ค๋ฅธ ์ฅ์(์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ)์ ๊ฐ์ง ์ ์์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ๋ชจ์(๊ธฐํํ์ ๊ตฌ์กฐ)์ ๊ณต์ ๋๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
WebGL์์๋ ์ด๊ฒ์ด ๋ค์๊ณผ ๊ฐ์ด ํด์๋ฉ๋๋ค:
- ๊ณต์ ์ ์ ๋ฐ์ดํฐ: 3D ๋ชจ๋ธ(์: ๋๋ฌด, ์๋์ฐจ, ๋น๋ฉ ๋ธ๋ก)์ ํ์ค ์ ์ ๋ฒํผ ๊ฐ์ฒด(VBO)์ ์ ์ฌ์ ์ผ๋ก ์ธ๋ฑ์ค ๋ฒํผ ๊ฐ์ฒด(IBO)๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฒ๋ง ์ ์๋ฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ GPU์ ํ ๋ฒ ์ ๋ก๋๋ฉ๋๋ค.
- ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ: ๋ชจ๋ธ์ ๊ฐ ๊ฐ๋ณ ๋ณต์ฌ๋ณธ์ ๋ํด ์ถ๊ฐ ์์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์์ฑ์ ์ผ๋ฐ์ ์ผ๋ก 4x4 ๋ณํ ํ๋ ฌ(์์น, ํ์ , ํฌ๊ธฐ์ฉ)์ ํฌํจํ์ง๋ง, ์์, ํ ์ค์ฒ ์คํ์ ๋๋ ํ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ์ธ์คํด์ค์ ๊ตฌ๋ณํ๋ ๋ค๋ฅธ ์์ฑ์ผ ์๋ ์์ต๋๋ค. ์ด ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ GPU์ ์ ๋ก๋๋์ง๋ง, ๊ฒฐ์ ์ ์ผ๋ก ํน๋ณํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ๋จ์ผ ๋๋ก์ฐ ์ฝ:
gl.drawElements()๋gl.drawArrays()๋ฅผ ์์ฒ ๋ฒ ํธ์ถํ๋ ๋์ ,gl.drawElementsInstanced()๋gl.drawArraysInstanced()์ ๊ฐ์ ํน์ํ ์ธ์คํด์ฑ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ค์ GPU์๊ฒ "์ด ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ N๋ฒ ๊ทธ๋ฆฌ๊ณ , ๊ฐ ์ธ์คํด์ค์ ๋ํด ๋ค์ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ ์งํฉ์ ์ฌ์ฉํ๋ผ"๊ณ ์ง์ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด GPU๋ ๊ฐ ์ธ์คํด์ค์ ๋ํ ๊ณต์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ์ ์ ์ ฐ์ด๋ ๋ด์์ ๊ณ ์ ํ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค. ์ด๋ CPU์ ์์ ์ ๊ณ ๋๋ก ๋ณ๋ ฌํ๋ GPU๋ก ํฌ๊ฒ ์ด์ ์ํค๋ฉฐ, GPU๋ ์ด๋ฌํ ๋ฐ๋ณต์ ์ธ ์์ ์ ํจ์ฌ ๋ ์ ํฉํ๋ฏ๋ก ๊ทน์ ์ธ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
WebGL 1 ๋ WebGL 2: ์ธ์คํด์ฑ์ ์งํ
์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ๊ฐ์ฉ์ฑ๊ณผ ๊ตฌํ์ WebGL 1.0๊ณผ WebGL 2.0 ๊ฐ์ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ๊ด๋ฒ์ํ๊ฒ ํธํ๋๋ ์น ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
WebGL 1.0 (ํ์ฅ ๊ธฐ๋ฅ: ANGLE_instanced_arrays)
WebGL 1.0์ด ์ฒ์ ๋์
๋์์ ๋, ์ธ์คํด์ฑ์ ํต์ฌ ๊ธฐ๋ฅ์ด ์๋์์ต๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ค์ ๋ฒค๋ ํ์ฅ ๊ธฐ๋ฅ์ธ ANGLE_instanced_arrays์ ์์กดํด์ผ ํ์ต๋๋ค. ์ด ํ์ฅ ๊ธฐ๋ฅ์ ์ธ์คํด์ค ๋ ๋๋ง์ ํ์ฑํํ๋ ๋ฐ ํ์ํ API ํธ์ถ์ ์ ๊ณตํฉ๋๋ค.
WebGL 1.0 ์ธ์คํด์ฑ์ ์ฃผ์ ํน์ง:
- ํ์ฅ ๊ธฐ๋ฅ ํ์ง:
gl.getExtension('ANGLE_instanced_arrays')๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ํ์ฅ ๊ธฐ๋ฅ์ ์ฟผ๋ฆฌํ๊ณ ํ์ฑํํด์ผ ํฉ๋๋ค. - ํ์ฅ ๊ธฐ๋ฅ๋ณ ํจ์: ์ธ์คํด์ฑ ๋๋ก์ฐ ์ฝ(์:
drawElementsInstancedANGLE)๊ณผ ์์ฑ ๋ถํ ์ ํจ์(vertexAttribDivisorANGLE)๋ANGLE์ ๋์ฌ๊ฐ ๋ถ์ต๋๋ค. - ํธํ์ฑ: ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆฌ ์ง์๋์ง๋ง, ํ์ฅ ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒ์ ์ค๋๋๊ฑฐ๋ ๋ ์ผ๋ฐ์ ์ธ ํ๋ซํผ์์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ: ์ฌ์ ํ ์ธ์คํด์ฑ์ด ์๋ ๋ ๋๋ง์ ๋นํด ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค.
WebGL 2.0 (ํต์ฌ ๊ธฐ๋ฅ)
OpenGL ES 3.0์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ WebGL 2.0์ ์ธ์คํด์ฑ์ ํต์ฌ ๊ธฐ๋ฅ์ผ๋ก ํฌํจํฉ๋๋ค. ์ด๋ ํ์ฅ ๊ธฐ๋ฅ์ ๋ช ์์ ์ผ๋ก ํ์ฑํํ ํ์๊ฐ ์์์ ์๋ฏธํ๋ฉฐ, ๊ฐ๋ฐ์์ ์์ ํ๋ฆ์ ๋จ์ํํ๊ณ ๋ชจ๋ ํธํ WebGL 2.0 ํ๊ฒฝ์์ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํฉ๋๋ค.
WebGL 2.0 ์ธ์คํด์ฑ์ ์ฃผ์ ํน์ง:
- ํ์ฅ ๊ธฐ๋ฅ ๋ถํ์: ์ธ์คํด์ฑ ํจ์(
gl.drawElementsInstanced,gl.drawArraysInstanced,gl.vertexAttribDivisor)๋ WebGL ๋ ๋๋ง ์ปจํ ์คํธ์์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ์ง์ ๋ณด์ฅ: ๋ธ๋ผ์ฐ์ ๊ฐ WebGL 2.0์ ์ง์ํ๋ค๋ฉด, ์ธ์คํด์ฑ ์ง์์ ๋ณด์ฅํ๋ฏ๋ก ๋ฐํ์ ํ์ธ์ด ํ์ ์์ต๋๋ค.
- ์
ฐ์ด๋ ์ธ์ด ๊ธฐ๋ฅ: WebGL 2.0์ GLSL ES 3.00 ์
ฐ์ด๋ฉ ์ธ์ด๋ ํ์ฌ ์ธ์คํด์ค์ ์ธ๋ฑ์ค๋ฅผ ์ ๊ณตํ๋ ์ ์ ์
ฐ์ด๋์ ํน์ ์
๋ ฅ ๋ณ์์ธ
gl_InstanceID๋ฅผ ๋ด์ฅ ์ง์ํฉ๋๋ค. ์ด๋ ์ ฐ์ด๋ ๋ก์ง์ ๋จ์ํํฉ๋๋ค. - ๋ ๋์ ๊ธฐ๋ฅ: WebGL 2.0์ Transform Feedback, Multiple Render Targets, ๋ ์ง๋ณด๋ ํ ์ค์ฒ ํ์๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฑ๋ฅ ๋ฐ ๊ธฐ๋ฅ ํฅ์์ ์ ๊ณตํ์ฌ ๋ณต์กํ ์ฅ๋ฉด์์ ์ธ์คํด์ฑ์ ๋ณด์ํ ์ ์์ต๋๋ค.
๊ถ์ฅ ์ฌํญ: ์๋ก์ด ํ๋ก์ ํธ์ ์ต๋ ์ฑ๋ฅ์ ์ํด์๋, ๊ด๋ฒ์ํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ด ์ ๋์ ์ธ ์ ์ฝ ์กฐ๊ฑด์ด ์๋๋ผ๋ฉด (WebGL 2.0์ ๋ณดํธ์ ์ด์ง๋ ์์ง๋ง ํ๋ฅญํ ์ง์์ ๋ฐ๊ณ ์์) WebGL 2.0์ ๋์์ผ๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค๋๋ ์ฅ์น์์ ๋ ๋์ ํธํ์ฑ์ด ์ค์ํ๋ค๋ฉด, ANGLE_instanced_arrays ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ WebGL 1.0์ผ๋ก์ ํด๋ฐฑ(fallback)์ด ํ์ํ ์ ์์ผ๋ฉฐ, ๋๋ WebGL 2.0์ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๊ณ WebGL 1.0 ๊ฒฝ๋ก๋ฅผ ํด๋ฐฑ์ผ๋ก ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์๋ ๊ฐ๋ฅํฉ๋๋ค.
์ธ์คํด์ฑ์ ๋ฉ์ปค๋์ฆ ์ดํด
์ธ์คํด์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๊ณต์ ๋ ๊ธฐํํ์ ๊ตฌ์กฐ์ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๊ฐ GPU์ ์ํด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ ํด์ผ ํฉ๋๋ค.
๊ณต์ ๊ธฐํํ์ ๋ฐ์ดํฐ
๊ฐ์ฒด์ ๊ธฐํํ์ ์ ์(์: ๋ฐ์, ์บ๋ฆญํฐ, ์ฐจ๋์ 3D ๋ชจ๋ธ)๋ ํ์ค ๋ฒํผ ๊ฐ์ฒด์ ์ ์ฅ๋ฉ๋๋ค:
- ์ ์ ๋ฒํผ ๊ฐ์ฒด(VBOs): ๋ชจ๋ธ์ ์์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์์น(
a_position), ๋ฒ์ ๋ฒกํฐ(a_normal), ํ ์ค์ฒ ์ขํ(a_texCoord)์ ๊ฐ์ ์์ฑ ๋ฐ ์ ์ฌ์ ์ผ๋ก ํ์ ํธ/๋ฐ์ดํ์ ํธ ๋ฒกํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ GPU์ ํ ๋ฒ ์ ๋ก๋๋ฉ๋๋ค. - ์ธ๋ฑ์ค ๋ฒํผ ๊ฐ์ฒด(IBOs) / ์์ ๋ฒํผ ๊ฐ์ฒด(EBOs): ๊ธฐํํ์ ๊ตฌ์กฐ๊ฐ ์ธ๋ฑ์ค ๋๋ก์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(๊ณต์ ์ ์ ์ ๋ํ ์ ์ ๋ฐ์ดํฐ ์ค๋ณต์ ํผํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ ์ํด ๊ฐ๋ ฅํ ๊ถ์ฅ๋จ), ์ ์ ์ด ์ด๋ป๊ฒ ์ผ๊ฐํ์ ํ์ฑํ๋์ง ์ ์ํ๋ ์ธ๋ฑ์ค๊ฐ IBO์ ์ ์ฅ๋ฉ๋๋ค. ์ด๊ฒ๋ ํ ๋ฒ๋ง ์ ๋ก๋๋ฉ๋๋ค.
์ธ์คํด์ฑ์ ์ฌ์ฉํ ๋, GPU๋ ๊ฐ ์ธ์คํด์ค์ ๋ํด ๊ณต์ ๋ ๊ธฐํํ์ ๊ตฌ์กฐ์ ์ ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์ธ์คํด์ค๋ณ ๋ณํ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ: ์ฐจ๋ณํ์ ํต์ฌ
์ด๊ฒ์ด ์ธ์คํด์ฑ์ด ์ ํต์ ์ธ ๋ ๋๋ง๊ณผ ๋ค๋ฅธ ์ ์ ๋๋ค. ๋ชจ๋ ๊ฐ์ฒด ์์ฑ์ ๊ฐ ๋๋ก์ฐ ์ฝ๊ณผ ํจ๊ป ๋ณด๋ด๋ ๋์ , ๊ฐ ์ธ์คํด์ค์ ๋ํด ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ณ๋์ ๋ฒํผ(๋๋ ๋ฒํผ๋ค)๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๋ฐ์ดํฐ๋ ์ธ์คํด์ค ์์ฑ(instanced attributes)์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค.
-
๊ทธ๊ฒ์ด ๋ฌด์์ธ๊ฐ: ์ผ๋ฐ์ ์ธ ์ธ์คํด์ค๋ณ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ชจ๋ธ ํ๋ ฌ: ๊ฐ ์ธ์คํด์ค์ ์์น, ํ์ ๋ฐ ํฌ๊ธฐ๋ฅผ ๊ฒฐํฉํ๋ 4x4 ํ๋ ฌ. ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋ ฅํ ์ธ์คํด์ค๋ณ ์์ฑ์ ๋๋ค.
- ์์: ๊ฐ ์ธ์คํด์ค์ ๊ณ ์ ํ ์์.
- ํ ์ค์ฒ ์คํ์ /์ธ๋ฑ์ค: ํ ์ค์ฒ ์ํ๋ผ์ค๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํน์ ์ธ์คํด์ค์ ๋ํด ์ฌ์ฉํ ํ ์ค์ฒ ๋งต์ ๋ถ๋ถ์ ์ง์ ํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ: ๋ฌผ๋ฆฌ ์ํ, ์ฒด๋ ฅ ๊ฐ ๋๋ ์ ๋๋ฉ์ด์ ๋จ๊ณ์ ๊ฐ์ด ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐํ ์์น ๋ฐ์ดํฐ.
-
์ ๋ฌ ๋ฐฉ๋ฒ: ์ธ์คํด์ค ๋ฐฐ์ด: ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ ์ผ๋ฐ ์ ์ ์์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ ์ด์์ VBO์ ์ ์ฅ๋ฉ๋๋ค. ๊ฒฐ์ ์ ์ธ ์ฐจ์ด์ ์ ์ด๋ฌํ ์์ฑ์ด
gl.vertexAttribDivisor()๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋์ง์ ์์ต๋๋ค. -
gl.vertexAttribDivisor(attributeLocation, divisor): ์ด ํจ์๋ ์ธ์คํด์ฑ์ ์ด์์ ๋๋ค. WebGL์๊ฒ ์์ฑ์ด ์ผ๋ง๋ ์์ฃผ ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋์ง๋ฅผ ์๋ ค์ค๋๋ค:divisor๊ฐ 0์ด๋ฉด (์ผ๋ฐ ์์ฑ์ ๊ธฐ๋ณธ๊ฐ), ์์ฑ ๊ฐ์ ๋ชจ๋ ์ ์ ๋ง๋ค ๋ณ๊ฒฝ๋ฉ๋๋ค.divisor๊ฐ 1์ด๋ฉด, ์์ฑ ๊ฐ์ ๋ชจ๋ ์ธ์คํด์ค๋ง๋ค ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด๋ ๋จ์ผ ์ธ์คํด์ค ๋ด์ ๋ชจ๋ ์ ์ ์ ๋ํด ์์ฑ์ด ๋ฒํผ์์ ๋์ผํ ๊ฐ์ ์ฌ์ฉํ๊ณ , ๋ค์ ์ธ์คํด์ค๋ก ๋์ด๊ฐ๋ฉด ๋ฒํผ์ ๋ค์ ๊ฐ์ผ๋ก ์ด๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.- ๋ค๋ฅธ
divisor๊ฐ(์: 2, 3)๋ ๊ฐ๋ฅํ์ง๋ง ๋ ์ผ๋ฐ์ ์ด๋ฉฐ, ์์ฑ์ด N๊ฐ์ ์ธ์คํด์ค๋ง๋ค ๋ณ๊ฒฝ๋จ์ ๋ํ๋ ๋๋ค.
-
์
ฐ์ด๋์
gl_InstanceID: ์ ์ ์ ฐ์ด๋(ํนํ WebGL 2.0์ GLSL ES 3.00)์์,gl_InstanceID๋ผ๋ ๋ด์ฅ ์ ๋ ฅ ๋ณ์๋ ๋ ๋๋ง๋๋ ํ์ฌ ์ธ์คํด์ค์ ์ธ๋ฑ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ ๋ฐฐ์ด์์ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ์ธ์คํด์ค ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ํ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. WebGL 1.0์ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋กgl_InstanceID๋ฅผ ์ ์ ์ ฐ์ด๋์์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก varying ๋ณ์๋ก ์ ๋ฌํ๊ฑฐ๋, ๋ ์ผ๋ฐ์ ์ผ๋ก๋ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์์ฑ์ ์๋ค๋ฉด ๋ช ์์ ์ธ ID ์์ด ์ธ์คํด์ค ์์ฑ์ ์ง์ ์์กดํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ, GPU๋ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ค์, ๊ฐ ์ธ์คํด์ค์ ๋ํด ๊ณ ์ ํ ์์ฑ๊ณผ ๊ฒฐํฉํ์ฌ ๊ทธ์ ๋ฐ๋ผ ๋ณํํ๊ณ ์ ฐ์ด๋ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด์ผ๋ง๋ก ์ธ์คํด์ฑ์ ๋งค์ฐ ๋ณต์กํ ์ฅ๋ฉด์์ ๊ฐ๋ ฅํ๊ฒ ๋ง๋๋ ์์์ ๋๋ค.
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ ๊ตฌํ (์ฝ๋ ์์ )
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ๊ฐ์ํ๋ ๊ตฌํ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋จํ ๋ชจ์(์: ํ๋ธ)์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ์์น์ ์์์ผ๋ก ๋ ๋๋งํ๋ ๋ฐ ์ค์ ์ ๋ ๊ฒ์ ๋๋ค. ์ด ์์ ๋ WebGL ์ปจํ ์คํธ ์ค์ ๋ฐ ์ ฐ์ด๋ ์ปดํ์ผ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ์ ์ ๋ก ํฉ๋๋ค.
1. ๊ธฐ๋ณธ WebGL ์ปจํ ์คํธ ๋ฐ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ
๋จผ์ , WebGL 2.0 ์ปจํ ์คํธ์ ๊ธฐ๋ณธ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ค์ ํฉ๋๋ค.
์ ์ ์
ฐ์ด๋ (vertexShaderSource):
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec4 a_color;
layout(location = 2) in mat4 a_modelMatrix;
uniform mat4 u_viewProjectionMatrix;
out vec4 v_color;
void main() {
v_color = a_color;
gl_Position = u_viewProjectionMatrix * a_modelMatrix * a_position;
}
ํ๋๊ทธ๋จผํธ ์
ฐ์ด๋ (fragmentShaderSource):
#version 300 es
precision highp float;
in vec4 v_color;
out vec4 outColor;
void main() {
outColor = v_color;
}
mat4 ํ์
์ธ a_modelMatrix ์์ฑ์ ์ฃผ๋ชฉํ์ธ์. ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ์ธ์คํด์ค๋ณ ์์ฑ์ด ๋ ๊ฒ์
๋๋ค. mat4๋ ๋ค ๊ฐ์ vec4 ์์น๋ฅผ ์ฐจ์งํ๋ฏ๋ก, ์์ฑ ๋ชฉ๋ก์์ 2, 3, 4, 5๋ฒ ์์น๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ `a_color` ๋ํ ์ธ์คํด์ค๋ณ ์์ฑ์
๋๋ค.
2. ๊ณต์ ๊ธฐํํ์ ๋ฐ์ดํฐ ์์ฑ (์: ํ๋ธ)
๊ฐ๋จํ ํ๋ธ์ ์ ์ ์์น๋ฅผ ์ ์ํฉ๋๋ค. ๊ฐ๊ฒฐํจ์ ์ํด ์ง์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง๋ง, ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ IBO๋ฅผ ์ฌ์ฉํ ์ธ๋ฑ์ค ๋๋ก์์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
const positions = [
// ์๋ฉด
-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, 0.5,
// ๋ท๋ฉด
-0.5, -0.5, -0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
-0.5, -0.5, -0.5,
0.5, 0.5, -0.5,
0.5, -0.5, -0.5,
// ์๋ฉด
-0.5, 0.5, -0.5,
-0.5, 0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, 0.5,
0.5, 0.5, -0.5,
// ์๋ซ๋ฉด
-0.5, -0.5, -0.5,
0.5, -0.5, -0.5,
0.5, -0.5, 0.5,
-0.5, -0.5, -0.5,
0.5, -0.5, 0.5,
-0.5, -0.5, 0.5,
// ์ค๋ฅธ์ชฝ ๋ฉด
0.5, -0.5, -0.5,
0.5, 0.5, -0.5,
0.5, 0.5, 0.5,
0.5, -0.5, -0.5,
0.5, 0.5, 0.5,
0.5, -0.5, 0.5,
// ์ผ์ชฝ ๋ฉด
-0.5, -0.5, -0.5,
-0.5, -0.5, 0.5,
-0.5, 0.5, 0.5,
-0.5, -0.5, -0.5,
-0.5, 0.5, 0.5,
-0.5, 0.5, -0.5
];
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
// ์์น์ ๋ํ ์ ์ ์์ฑ ์ค์ (location 0)
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.vertexAttribDivisor(0, 0); // Divisor 0: ์์ฑ์ด ์ ์ ๋ง๋ค ๋ณ๊ฒฝ๋จ
3. ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ ์์ฑ (ํ๋ ฌ ๋ฐ ์์)
๊ฐ ์ธ์คํด์ค์ ๋ํ ๋ณํ ํ๋ ฌ๊ณผ ์์์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ทธ๋ฆฌ๋ ํํ๋ก ๋ฐฐ์ด๋ 1000๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
const numInstances = 1000;
const instanceMatrices = new Float32Array(numInstances * 16); // mat4๋น 16๊ฐ์ float
const instanceColors = new Float32Array(numInstances * 4); // vec4(RGBA)๋น 4๊ฐ์ float
// ์ธ์คํด์ค ๋ฐ์ดํฐ ์ฑ์ฐ๊ธฐ
for (let i = 0; i < numInstances; ++i) {
const matrixOffset = i * 16;
const colorOffset = i * 4;
const x = (i % 30) * 1.5 - 22.5; // ์์ ๊ทธ๋ฆฌ๋ ๋ ์ด์์
const y = Math.floor(i / 30) * 1.5 - 22.5;
const z = (Math.sin(i * 0.1) * 5);
const rotation = i * 0.05; // ์์ ํ์
const scale = 0.5 + Math.sin(i * 0.03) * 0.2; // ์์ ํฌ๊ธฐ
// ๊ฐ ์ธ์คํด์ค์ ๋ํ ๋ชจ๋ธ ํ๋ ฌ ์์ฑ (gl-matrix์ ๊ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ)
const m = mat4.create();
mat4.translate(m, m, [x, y, z]);
mat4.rotateY(m, m, rotation);
mat4.scale(m, m, [scale, scale, scale]);
// ํ๋ ฌ์ instanceMatrices ๋ฐฐ์ด์ ๋ณต์ฌ
instanceMatrices.set(m, matrixOffset);
// ๊ฐ ์ธ์คํด์ค์ ๋ฌด์์ ์์ ํ ๋น
instanceColors[colorOffset + 0] = Math.random();
instanceColors[colorOffset + 1] = Math.random();
instanceColors[colorOffset + 2] = Math.random();
instanceColors[colorOffset + 3] = 1.0; // ์ํ
}
// ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ ์์ฑ ๋ฐ ์ฑ์ฐ๊ธฐ
const instanceMatrixBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instanceMatrices, gl.DYNAMIC_DRAW); // ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด DYNAMIC_DRAW ์ฌ์ฉ
const instanceColorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, instanceColorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, instanceColors, gl.DYNAMIC_DRAW);
4. ์ธ์คํด์ค๋ณ VBO๋ฅผ ์์ฑ์ ์ฐ๊ฒฐํ๊ณ Divisor ์ค์
์ด๊ฒ์ด ์ธ์คํด์ฑ์ ํต์ฌ ๋จ๊ณ์ ๋๋ค. WebGL์๊ฒ ์ด๋ฌํ ์์ฑ๋ค์ด ์ ์ ๋ง๋ค ํ ๋ฒ์ด ์๋๋ผ ์ธ์คํด์ค๋ง๋ค ํ ๋ฒ์ฉ ๋ณ๊ฒฝ๋๋ค๊ณ ์๋ ค์ค๋๋ค.
// ์ธ์คํด์ค ์์ ์์ฑ ์ค์ (location 1)
gl.enableVertexAttribArray(1);
gl.bindBuffer(gl.ARRAY_BUFFER, instanceColorBuffer);
gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);
gl.vertexAttribDivisor(1, 1); // Divisor 1: ์์ฑ์ด ์ธ์คํด์ค๋ง๋ค ๋ณ๊ฒฝ๋จ
// ์ธ์คํด์ค ๋ชจ๋ธ ํ๋ ฌ ์์ฑ ์ค์ (locations 2, 3, 4, 5)
// mat4๋ 4๊ฐ์ vec4์ด๋ฏ๋ก 4๊ฐ์ ์์ฑ ์์น๊ฐ ํ์ํฉ๋๋ค.
const matrixLocation = 2; // a_modelMatrix์ ์์ ์์น
gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
for (let i = 0; i < 4; ++i) {
gl.enableVertexAttribArray(matrixLocation + i);
gl.vertexAttribPointer(
matrixLocation + i, // location
4, // size (vec4)
gl.FLOAT, // type
false, // normalize
16 * 4, // stride (sizeof(mat4) = 16 floats * 4 bytes/float)
i * 4 * 4 // offset (๊ฐ vec4 ์ด์ ๋ํ ์คํ์
)
);
gl.vertexAttribDivisor(matrixLocation + i, 1); // Divisor 1: ์์ฑ์ด ์ธ์คํด์ค๋ง๋ค ๋ณ๊ฒฝ๋จ
}
5. ์ธ์คํด์ค ๋๋ก์ฐ ์ฝ
๋ง์ง๋ง์ผ๋ก, ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋ธ๋น 36๊ฐ์ ์ ์ (6๋ฉด * ๋ฉด๋น 2๊ฐ ์ผ๊ฐํ * ์ผ๊ฐํ๋น 3๊ฐ ์ ์ )์ numInstances๋ฒ ๊ทธ๋ฆฝ๋๋ค.
function render() {
// ... (viewProjectionMatrix ์
๋ฐ์ดํธ ๋ฐ uniform ์
๋ก๋)
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
// ์
ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ฌ์ฉ
gl.useProgram(program);
// ์ง์ค๋ฉํธ๋ฆฌ ๋ฒํผ(์์น) ๋ฐ์ธ๋ฉ - ์ด๋ฏธ ์์ฑ ์ค์ ์ ๋ฐ์ธ๋ฉ๋จ
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
// ์ธ์คํด์ค๋ณ ์์ฑ์ ๊ฒฝ์ฐ, ์ด๋ฏธ ๋ฐ์ธ๋ฉ๋๊ณ ๋ถํ ์ค์ ์ด ๋์ด ์์
// ํ์ง๋ง ์ธ์คํด์ค ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋๋ฉด ์ฌ๊ธฐ์ ๋ค์ ๋ฒํผ๋งํด์ผ ํจ
// gl.bindBuffer(gl.ARRAY_BUFFER, instanceMatrixBuffer);
// gl.bufferData(gl.ARRAY_BUFFER, instanceMatrices, gl.DYNAMIC_DRAW);
gl.drawArraysInstanced(
gl.TRIANGLES, // mode
0, // first vertex
36, // count (์ธ์คํด์ค๋น ์ ์ ์, ํ๋ธ๋ 36๊ฐ)
numInstances // instanceCount
);
requestAnimationFrame(render);
}
render(); // ๋ ๋๋ง ๋ฃจํ ์์
์ด ๊ตฌ์กฐ๋ ํต์ฌ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ณต์ ๋ positionBuffer๋ divisor๊ฐ 0์ผ๋ก ์ค์ ๋์ด ๊ฐ์ด ๊ฐ ์ ์ ์ ๋ํด ์์ฐจ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. instanceColorBuffer์ instanceMatrixBuffer๋ divisor๊ฐ 1๋ก ์ค์ ๋์ด ๊ฐ์ด ์ธ์คํด์ค๋น ํ ๋ฒ์ฉ ๊ฐ์ ธ์์ง๋๋ค. ๊ทธ๋ฐ ๋ค์ gl.drawArraysInstanced ํธ์ถ์ ๋ชจ๋ ํ๋ธ๋ฅผ ํ ๋ฒ์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
๊ณ ๊ธ ์ธ์คํด์ฑ ๊ธฐ๋ฒ ๋ฐ ๊ณ ๋ ค์ฌํญ
๊ธฐ๋ณธ์ ์ธ ๊ตฌํ๋ง์ผ๋ก๋ ์์ฒญ๋ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํตํด ์ธ์คํด์ค ๋ ๋๋ง์ ๋์ฑ ์ต์ ํํ๊ณ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ธ์คํด์ค ์ปฌ๋ง(Culling)
์ธ์คํด์ฑ์ ์ฌ์ฉํ๋๋ผ๋ ์์ฒ ๋๋ ์๋ฐฑ๋ง ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ์นด๋ฉ๋ผ ์์ผ(ํ๋ฌ์คํ )๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด ๊ฐ๋ ค์ง๋ ๋น์จ์ด ๋์ ๊ฒฝ์ฐ ์ฌ์ ํ ๋ถ๋ด์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์ปฌ๋ง์ ๊ตฌํํ๋ฉด GPU์ ์์ ๋ถํ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
-
ํ๋ฌ์คํ
์ปฌ๋ง(Frustum Culling): ์ด ๊ธฐ๋ฒ์ ๊ฐ ์ธ์คํด์ค์ ๊ฒฝ๊ณ ๋ณผ๋ฅจ(์: ๊ฒฝ๊ณ ์์ ๋๋ ๊ตฌ)์ด ์นด๋ฉ๋ผ์ ๋ทฐ ํ๋ฌ์คํ
๊ณผ ๊ต์ฐจํ๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค. ์ธ์คํด์ค๊ฐ ํ๋ฌ์คํ
๋ฐ์ ์์ ํ ์๋ค๋ฉด, ๋ ๋๋ง ์ ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ์์ ์ ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๋๋ก์ฐ ์ฝ์
instanceCount๋ฅผ ์ค์ฌ์ค๋๋ค.- ๊ตฌํ: ์ฃผ๋ก CPU์์ ์ํ๋ฉ๋๋ค. ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ๋ชจ๋ ์ ์ฌ์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ํ๋ฌ์คํ ํ ์คํธ๋ฅผ ์ํํ๊ณ , ๋ณด์ด๋ ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ง ๋ฒํผ์ ์ถ๊ฐํฉ๋๋ค.
- ์ฑ๋ฅ ํธ๋ ์ด๋์คํ: GPU ์์ ์ ์ ์ฝํ๋ ๋ฐ๋ฉด, CPU ์ปฌ๋ง ๋ก์ง ์์ฒด๊ฐ ๋งค์ฐ ๋ง์ ์์ ์ธ์คํด์ค์ ๋ํด์๋ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ์๋ฐฑ๋ง ๊ฐ์ ์ธ์คํด์ค์ ๊ฒฝ์ฐ, ์ด CPU ๋น์ฉ์ด ์ธ์คํด์ฑ์ ์ผ๋ถ ์ด์ ์ ์์ํ ์ ์์ต๋๋ค.
- ์คํด๋ฃจ์ ์ปฌ๋ง(Occlusion Culling): ์ด๋ ๋ค๋ฅธ ๊ฐ์ฒด ๋ค์ ์จ๊ฒจ์ง ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํ์ง ์๋๋ก ํ๋ ๋ ๋ณต์กํ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ์ธต์ Z-๋ฒํผ๋ง๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฒฝ๊ณ ์์๋ฅผ ๋ ๋๋งํ์ฌ GPU์ ๊ฐ์์ฑ์ ์ฟผ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก GPU์์ ์ํ๋ฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ ์ธ์คํด์ฑ ๊ฐ์ด๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง๋ง, ๋ฐ์ง๋ ์ฅ๋ฉด์์ ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ๋ฒ์ ๋๋ค.
์ธ์คํด์ค์ ๋ํ ๋ ๋ฒจ ์ค๋ธ ๋ํ ์ผ(LOD)
๋ฉ๋ฆฌ ์๋ ๊ฐ์ฒด์ ๋ํด ๊ณ ํด์๋ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข ์ข ๋ถํ์ํ๊ณ ๋ญ๋น์ ๋๋ค. LOD ์์คํ ์ ์ธ์คํด์ค์ ์นด๋ฉ๋ผ ๊ฐ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๋ชจ๋ธ์ ๋ค๋ฅธ ๋ฒ์ (ํด๋ฆฌ๊ณค ์์ ํ ์ค์ฒ ๋ํ ์ผ์ด ๋ค๋ฆ) ์ฌ์ด๋ฅผ ๋์ ์ผ๋ก ์ ํํฉ๋๋ค.
- ๊ตฌํ: ์ฌ๋ฌ ์ธํธ์ ๊ณต์ ์ง์ค๋ฉํธ๋ฆฌ ๋ฒํผ(์:
cube_high_lod_positions,cube_medium_lod_positions,cube_low_lod_positions)๋ฅผ ๊ฐ์ง์ผ๋ก์จ ๋ฌ์ฑํ ์ ์์ต๋๋ค. - ์ ๋ต: ํ์ํ LOD๋ณ๋ก ์ธ์คํด์ค๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ LOD ๊ทธ๋ฃน์ ๋ํด ๋ณ๋์ ์ธ์คํด์ค ๋๋ก์ฐ ์ฝ์ ์ํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ์ ํฉํ ์ง์ค๋ฉํธ๋ฆฌ ๋ฒํผ๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, 50 ์ ๋ ๋ด์ ๋ชจ๋ ์ธ์คํด์ค๋ LOD 0์, 50-200 ์ ๋์ LOD 1์, 200 ์ ๋์ ๋์ด์๋ LOD 2๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ด์ : ๊ฐ๊น์ด ๊ฐ์ฒด์ ์๊ฐ์ ํ์ง์ ์ ์งํ๋ฉด์ ๋ฉ๋ฆฌ ์๋ ๊ฐ์ฒด์ ๊ธฐํํ์ ๋ณต์ก์ฑ์ ์ค์ฌ GPU ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๋์ ์ธ์คํด์ฑ: ์ธ์คํด์ค ๋ฐ์ดํฐ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ
๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ธ์คํด์ค๊ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ง์ด๊ฑฐ๋, ์์์ด ๋ณํ๊ฑฐ๋, ์ ๋๋ฉ์ด์ ๋์ด์ผ ํฉ๋๋ค. ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ ์์ฃผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ฒํผ ์ฌ์ฉ๋ฒ: ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ ์์ฑํ ๋
gl.STATIC_DRAW๋์gl.DYNAMIC_DRAW๋๋gl.STREAM_DRAW๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ GPU ๋๋ผ์ด๋ฒ์๊ฒ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์ ๋ฐ์ดํธ๋ ๊ฒ์์ ์์ํฉ๋๋ค. - ์
๋ฐ์ดํธ ๋น๋: ๋ ๋๋ง ๋ฃจํ์์ CPU ์ธก์
instanceMatrices๋๋instanceColors๋ฐฐ์ด์ ์์ ํ ๋ค์,gl.bufferData()๋๋gl.bufferSubData()๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐฐ์ด(๋๋ ์ผ๋ถ ์ธ์คํด์ค๋ง ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํ์ ๋ฒ์)์ GPU์ ๋ค์ ์ ๋ก๋ํฉ๋๋ค. - ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ: ์ธ์คํด์ค ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ ํจ์จ์ ์ด์ง๋ง, ๋งค์ฐ ํฐ ๋ฒํผ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๋ก๋ํ๋ ๊ฒ์ ์ฌ์ ํ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ฌ๋ฌ ๋ฒํผ ๊ฐ์ฒด(ํํ)์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ GPU์ ์ง์ฐ์ ํผํจ์ผ๋ก์จ ์ต์ ํํ์ญ์์ค.
๋ฐฐ์นญ(Batching) ๋ ์ธ์คํด์ฑ(Instancing)
๋ฐฐ์นญ๊ณผ ์ธ์คํด์ฑ์ ๋ชจ๋ ๋๋ก์ฐ ์ฝ์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ง๋ง ์๋ก ๋ค๋ฅธ ์๋๋ฆฌ์ค์ ์ ํฉํ๋ฏ๋ก ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
-
๋ฐฐ์นญ: ์ฌ๋ฌ ๊ฐ์ ์๋ก ๋ค๋ฅธ (๋๋ ๋น์ทํ์ง๋ง ๋์ผํ์ง ์์) ๊ฐ์ฒด์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ ํฐ ์ ์ ๋ฒํผ๋ก ๊ฒฐํฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋์ ๋๋ก์ฐ ์ฝ๋ก ๊ทธ๋ฆด ์ ์์ต๋๋ค. ์ฌ์ง์ ๊ณต์ ํ์ง๋ง ๊ธฐํํ์ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๊ฑฐ๋ ์ธ์คํด์ค๋ณ ์์ฑ์ผ๋ก ์ฝ๊ฒ ํํํ ์ ์๋ ๊ณ ์ ํ ๋ณํ์ ๊ฐ์ง ๊ฐ์ฒด์ ์ ์ฉํฉ๋๋ค.
- ์์: ์ฌ๋ฌ ๊ฐ์ ๊ณ ์ ํ ๊ฑด๋ฌผ ๋ถํ์ ํ๋์ ๋ฉ์ฌ๋ก ๋ณํฉํ์ฌ ๋ณต์กํ ๊ฑด๋ฌผ์ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํฉ๋๋ค.
-
์ธ์คํด์ฑ: ๋์ผํ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฅธ ์ธ์คํด์ค๋ณ ์์ฑ์ผ๋ก ์ฌ๋ฌ ๋ฒ ๊ทธ๋ฆฝ๋๋ค. ์์์ ์์ฑ๋ง ๋ณต์ฌ๋ณธ๋ง๋ค ๋ณ๊ฒฝ๋๋ ์ง์ ์ผ๋ก ๋์ผํ ๊ธฐํํ์ ๊ตฌ์กฐ์ ์ด์์ ์
๋๋ค.
- ์์: ๊ฐ๊ฐ ๋ค๋ฅธ ์์น, ํ์ , ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์์ฒ ๊ฐ์ ๋์ผํ ๋๋ฌด๋ฅผ ๋ ๋๋งํฉ๋๋ค.
- ๊ฒฐํฉ๋ ์ ๊ทผ ๋ฐฉ์: ์ข ์ข ๋ฐฐ์นญ๊ณผ ์ธ์คํด์ฑ์ ์กฐํฉ์ด ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๋๋ฌด์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ ํ๋์ ๋ฉ์ฌ๋ก ๋ฐฐ์นญํ ๋ค์, ๊ทธ ์ ์ฒด ๋ฐฐ์นญ๋ ๋๋ฌด๋ฅผ ์์ฒ ๋ฒ ์ธ์คํด์ฑํฉ๋๋ค.
์ฑ๋ฅ ์งํ
์ธ์คํด์ฑ์ ์ํฅ์ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค:
- ๋๋ก์ฐ ์ฝ: ๊ฐ์ฅ ์ง์ ์ ์ธ ์งํ์ ๋๋ค. ์ธ์คํด์ฑ์ ์ด ์์น๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ์ผ ํฉ๋๋ค.
- ํ๋ ์ ์๋(FPS): FPS๊ฐ ๋์์๋ก ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ด ์ข๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
- CPU ์ฌ์ฉ๋: ์ธ์คํด์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋๋ง๊ณผ ๊ด๋ จ๋ CPU ๊ธ์ฆ์ ์ค์ ๋๋ค.
- GPU ์ฌ์ฉ๋: ์ธ์คํด์ฑ์ ์์ ์ GPU๋ก ์ด์ ํ์ง๋ง, ์ด๋ GPU๊ฐ ๋๋ก์ฐ ์ฝ๋น ๋ ๋ง์ ์์ ์ ์ํํ๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํฉ๋๋ค. GPU ํ๋ ์ ์๊ฐ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ด์ GPU ๋ฐ์ด๋๊ฐ ์๋์ง ํ์ธํ์ญ์์ค.
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์ด์
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์ฑํ์ ์น ๊ธฐ๋ฐ 3D ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ง์ ์ด์ ์ ๊ฐ์ ธ๋ค์ฃผ๋ฉฐ, ๊ฐ๋ฐ ํจ์จ์ฑ์์๋ถํฐ ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ํ์ ํ๊ฒ ๊ฐ์๋ ๋๋ก์ฐ ์ฝ: ์ด๊ฒ์ด ๊ฐ์ฅ ์ฃผ์ํ๊ณ ์ฆ๊ฐ์ ์ธ ์ด์ ์ ๋๋ค. ์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ๊ฐ๋ณ ๋๋ก์ฐ ์ฝ์ ๋จ์ผ ์ธ์คํด์ค ์ฝ๋ก ๋์ฒดํจ์ผ๋ก์จ CPU์ ์ค๋ฒํค๋๊ฐ ๋ํญ ๊ฐ์ํ์ฌ ํจ์ฌ ๋ ์ํํ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ง๋ญ๋๋ค.
- ๋ฎ์ CPU ์ค๋ฒํค๋: CPU๊ฐ ๋ ๋๋ง ๋ช ๋ น์ ์ค๋นํ๊ณ ์ ์ถํ๋ ๋ฐ ์๊ฐ์ ๋ ์๋นํ๋ฏ๋ก ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ , ๊ฒ์ ๋ก์ง ๋๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ ๋ฐ์ดํธ์ ๊ฐ์ ๋ค๋ฅธ ์์ ์ ์ํ ๋ฆฌ์์ค๊ฐ ํ๋ณด๋ฉ๋๋ค. ์ด๋ ๋ณต์กํ ์ฅ๋ฉด์์ ์ํธ ์์ฉ์ฑ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ํฅ์๋ GPU ํ์ฉ๋: ์ต์ GPU๋ ๊ณ ๋๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ธ์คํด์ฑ์ ์ด๋ฌํ ๊ฐ์ ์ ์ง์ ์ ์ผ๋ก ํ์ฉํ์ฌ GPU๊ฐ ๋์ผํ ๊ธฐํํ์ ๊ตฌ์กฐ์ ๋ง์ ์ธ์คํด์ค๋ฅผ ๋์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ์ฌ ๋ ๋๋ง ์๊ฐ์ ๋จ์ถ์ํต๋๋ค.
- ๋๊ท๋ชจ ์ฅ๋ฉด ๋ณต์ก์ฑ ๊ตฌํ ๊ฐ๋ฅ: ์ธ์คํด์ฑ์ ๊ฐ๋ฐ์๊ฐ ์ด์ ์๋ ๋ถ๊ฐ๋ฅํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ฅ๋ฉด์ ๋ง๋ค ์ ์๊ฒ ํฉ๋๋ค. ์์ฒ ๋์ ์๋์ฐจ์ ๋ณดํ์๊ฐ ์๋ ๋ถ์ฃผํ ๋์, ์๋ฐฑ๋ง ๊ฐ์ ๋๋ญ์์ด ์๋ ๋นฝ๋นฝํ ์ฒ, ๋๋ ๋ฐฉ๋ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ํ๋ด๋ ๊ณผํ์ ์๊ฐํ ๋ฑ์ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ์ค์๊ฐ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ์์ํด๋ณด์ญ์์ค.
- ๋ ๋์ ์๊ฐ์ ์ถฉ์ค๋์ ํ์ค๊ฐ: ๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ์ ์๊ฒ ํจ์ผ๋ก์จ, ์ธ์คํด์ฑ์ ๋ ํ๋ถํ๊ณ , ๋ ๋ชฐ์ ๊ฐ ์์ผ๋ฉฐ, ๋ ๋ฏฟ์ ์ ์๋ 3D ํ๊ฒฝ์ ์ง์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค. ์ด๋ ํ๋์จ์ด์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๋งค๋ ฅ์ ์ธ ๊ฒฝํ์ผ๋ก ์ง์ ๋ณํ๋ฉ๋๋ค.
- ๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ ์ ์ฅ๋์ง๋ง, ํต์ฌ ๊ธฐํํ์ ๋ฐ์ดํฐ๋ ํ ๋ฒ๋ง ๋ก๋๋๋ฏ๋ก GPU์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์ค์ด๋ค์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ์ฅ์น์ ์ค์ํ ์ ์์ต๋๋ค.
- ๋จ์ํ๋ ์์ ๊ด๋ฆฌ: ๋ชจ๋ ์ ์ฌํ ๊ฐ์ฒด์ ๋ํด ๊ณ ์ ํ ์์ ์ ๊ด๋ฆฌํ๋ ๋์ , ๋จ์ผ์ ๊ณ ํ์ง ๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ง์คํ ๋ค์ ์ธ์คํด์ฑ์ ์ฌ์ฉํ์ฌ ์ฅ๋ฉด์ ์ฑ์ธ ์ ์์ด ์ฝํ ์ธ ์ ์ ํ์ดํ๋ผ์ธ์ ๊ฐ์ํํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ค์ ์ข ํฉ์ ์ผ๋ก ๋ ๋น ๋ฅด๊ณ , ๋ ๊ฒฌ๊ณ ํ๋ฉฐ, ์๊ฐ์ ์ผ๋ก ๋ฉ์ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ฌํ๋ฉฐ, ๋ค์ํ ํด๋ผ์ด์ธํธ ์ฅ์น์์ ์ํํ๊ฒ ์คํ๋์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ์ฑ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ํฅ์์ํต๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ๋ฌธ์ ํด๊ฒฐ
๊ฐ๋ ฅํ์ง๋ง, ์ธ์คํด์ฑ์ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ํ์ ๋๋ค:
-
์๋ชป๋
gl.vertexAttribDivisor()์ค์ : ์ด๊ฒ์ด ๊ฐ์ฅ ๋น๋ฒํ ์ค๋ฅ์ ์์ธ์ ๋๋ค. ์ธ์คํด์ฑ์ ์๋ํ ์์ฑ์ด divisor 1๋ก ์ค์ ๋์ง ์์ผ๋ฉด, ๋ชจ๋ ์ธ์คํด์ค์ ๋ํด ๋์ผํ ๊ฐ์ ์ฌ์ฉํ๊ฑฐ๋(์ ์ญ ์ ๋ํผ์ธ ๊ฒฝ์ฐ) ์ ์ ๋ณ๋ก ๋ฐ๋ณต๋์ด ์๊ฐ์ ๊ฒฐํจ์ด๋ ์๋ชป๋ ๋ ๋๋ง์ ์ด๋ํฉ๋๋ค. ๋ชจ๋ ์ธ์คํด์ค๋ณ ์์ฑ์ divisor๊ฐ 1๋ก ์ค์ ๋์๋์ง ๋ค์ ํ์ธํ์ญ์์ค. -
ํ๋ ฌ์ ๋ํ ์์ฑ ์์น ๋ถ์ผ์น:
mat4๋ ๋ค ๊ฐ์ ์ฐ์์ ์ธ ์์ฑ ์์น๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ ฐ์ด๋์ ํ๋ ฌ์ ๋ํlayout(location = X)๊ฐmatrixLocation๋ฐmatrixLocation + 1,+2,+3์ ๋ํดgl.vertexAttribPointerํธ์ถ์ ์ค์ ํ๋ ๋ฐฉ์๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค. -
๋ฐ์ดํฐ ๋๊ธฐํ ๋ฌธ์ (๋์ ์ธ์คํด์ฑ): ์ธ์คํด์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์
๋ฐ์ดํธ๋์ง ์๊ฑฐ๋ '์ ํ'ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ฉด, CPU ์ธก ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ GPU์ ๋ค์ ์
๋ก๋(
gl.bufferData๋๋gl.bufferSubData)ํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ๋ํ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ๋ฒํผ๊ฐ ๋ฐ์ธ๋ฉ๋์ด ์๋์ง ํ์ธํ์ญ์์ค. -
gl_InstanceID๊ด๋ จ ์ ฐ์ด๋ ์ปดํ์ผ ์ค๋ฅ:gl_InstanceID๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ ฐ์ด๋๊ฐ#version 300 es(WebGL 2.0์ฉ)์ธ์ง ํ์ธํ๊ฑฐ๋,ANGLE_instanced_arraysํ์ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฑํํ๊ณ WebGL 1.0์์ ์ธ์คํด์ค ID๋ฅผ ์๋์ผ๋ก ์์ฑ์ผ๋ก ์ ๋ฌํ๋์ง ํ์ธํ์ญ์์ค. - ๊ธฐ๋๋งํผ ์ฑ๋ฅ์ด ํฅ์๋์ง ์์: ํ๋ ์ ์๋๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ์ง ์๋๋ค๋ฉด, ์ธ์คํด์ฑ์ด ์ฃผ๋ ๋ณ๋ชฉ ํ์์ ํด๊ฒฐํ์ง ๋ชปํ๊ณ ์์ ์ ์์ต๋๋ค. ํ๋กํ์ผ๋ง ๋๊ตฌ(๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฑ๋ฅ ํญ ๋๋ ์ ๋ฌธ GPU ํ๋กํ์ผ๋ฌ ๋ฑ)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ ํ CPU ๋ฐ์ด๋ ์ํ์ธ์ง(์: ๊ณผ๋ํ ๋ฌผ๋ฆฌ ๊ณ์ฐ, JavaScript ๋ก์ง ๋๋ ๋ณต์กํ ์ปฌ๋ง์ผ๋ก ์ธํด), ์๋๋ฉด ๋ค๋ฅธ GPU ๋ณ๋ชฉ ํ์(์: ๋ณต์กํ ์ ฐ์ด๋, ๋๋ฌด ๋ง์ ํด๋ฆฌ๊ณค, ํ ์ค์ฒ ๋์ญํญ)์ด ์์ฉํ๊ณ ์๋์ง ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํฐ ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ: ์ธ์คํด์ฑ์ ํจ์จ์ ์ด์ง๋ง, ๊ทน๋๋ก ํฐ ์ธ์คํด์ค ๋ฐ์ดํฐ ๋ฒํผ(์: ๋ณต์กํ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์๋ฐฑ๋ง ๊ฐ์ ์ธ์คํด์ค)๋ ์ฌ์ ํ ์๋นํ GPU ๋ฉ๋ชจ๋ฆฌ์ ๋์ญํญ์ ์๋นํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ ๋ก๋ ๋๋ ๊ฐ์ ธ์ค๊ธฐ ์ค์ ์ ์ฌ์ ์ผ๋ก ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ์ปฌ๋ง, LOD ๋๋ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ต์ ํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๋ ๋๋ง ์์์ ํฌ๋ช ๋: ํฌ๋ช ํ ์ธ์คํด์ค์ ๊ฒฝ์ฐ ๋ ๋๋ง ์์๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์, ํฌ๋ช ๋๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ ๋ค์์ ์์ผ๋ก ๋ ๋๋ง์ ์ธ์คํด์ค๋ณ๋ก ์ง์ ์ ์ผ๋ก ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ์ข ์ข CPU์์ ์ธ์คํด์ค๋ฅผ ์ ๋ ฌํ ๋ค์ ์ ๋ ฌ๋ ์ธ์คํด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ๋ก๋ํ๊ฑฐ๋, ์์ ๋ ๋ฆฝ์ ์ธ ํฌ๋ช ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ ์คํ ๋๋ฒ๊น ๊ณผ ํนํ ์์ฑ ๊ตฌ์ฑ์ ๋ํ ์ธ์ฌํ ์ฃผ์๊ฐ ์ฑ๊ณต์ ์ธ ์ธ์คํด์ฑ ๊ตฌํ์ ํต์ฌ์ ๋๋ค.
์ค์ ์ ์ฉ ์ฌ๋ก ๋ฐ ๊ธ๋ก๋ฒ ์ํฅ
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์ค์ ์ ์ฉ ์ฌ๋ก๋ ๋ฐฉ๋ํ๊ณ ์ง์์ ์ผ๋ก ํ์ฅ๋๊ณ ์์ผ๋ฉฐ, ๋ค์ํ ๋ถ์ผ์์ ํ์ ์ ์ฃผ๋ํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋์งํธ ๊ฒฝํ์ ํ๋ถํ๊ฒ ํ๊ณ ์์ต๋๋ค.
-
๊ฒ์ ๊ฐ๋ฐ: ์ด๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ๋๋๋ฌ์ง ์ ์ฉ ๋ถ์ผ์ผ ๊ฒ์
๋๋ค. ์ธ์คํด์ฑ์ ๋ค์์ ๋ ๋๋งํ๋ ๋ฐ ํ์์ ์
๋๋ค:
- ๊ดํํ ํ๊ฒฝ: ์์ฒ ๊ทธ๋ฃจ์ ๋๋ฌด์ ๋ค๋ถ์ด ์๋ ์ฒ, ์๋ง์ ๊ฑด๋ฌผ์ด ์๋ sprawling ๋์, ๋๋ ๋ค์ํ ์์ ์งํ์ด ์๋ ์คํ ์๋ ํ๊ฒฝ.
- ๊ตฐ์ค๊ณผ ๊ตฐ๋: ์๋ง์ ์บ๋ฆญํฐ๋ก ์ฅ๋ฉด์ ์ฑ์ฐ๊ณ , ๊ฐ๊ฐ์ ์์น, ๋ฐฉํฅ, ์์์ ๋ฏธ๋ฌํ ๋ณํ๋ฅผ ์ฃผ์ด ๊ฐ์ ์ธ๊ณ์ ์๋ช ์ ๋ถ์ด๋ฃ์ต๋๋ค.
- ํํฐํด ์์คํ : ์ฐ๊ธฐ, ๋ถ, ๋น ๋๋ ๋ง๋ฒ ํจ๊ณผ๋ฅผ ์ํ ์๋ฐฑ๋ง ๊ฐ์ ํํฐํด์ ๋ชจ๋ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
-
๋ฐ์ดํฐ ์๊ฐํ: ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํํํ๋ ๋ฐ ์์ด, ์ธ์คํด์ฑ์ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค:
- ์ฐ์ ๋: ์๋ฐฑ๋ง ๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ(์: ์์ ๊ตฌ๋ ํ๋ธ)๋ฅผ ์๊ฐํํ๋ฉฐ, ๊ฐ ์ ์ ์์น, ์์, ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ฐจ์์ ๋ํ๋ผ ์ ์์ต๋๋ค.
- ๋ถ์ ๊ตฌ์กฐ: ์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ์์์ ๊ฒฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ณต์กํ ๋ถ์๋ฅผ ๋ ๋๋งํ๋ฉฐ, ๊ฐ ์์์ ๊ฒฐํฉ์ ๊ตฌ๋ ์ํต์ ์ธ์คํด์ค์ ๋๋ค.
- ์ง๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ: ๋์ ์ง๋ฆฌ์ ์ง์ญ์ ๊ฑธ์ณ ๋์, ์ธ๊ตฌ ๋๋ ํ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ฉฐ, ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ ์ธ์คํด์คํ๋ ์๊ฐ์ ๋ง์ปค์ ๋๋ค.
-
๊ฑด์ถ ๋ฐ ์์ง๋์ด๋ง ์๊ฐํ:
- ๋ํ ๊ตฌ์กฐ๋ฌผ: ๋ํ ๊ฑด๋ฌผ์ด๋ ์ฐ์ ํ๋ํธ์์ ๋ณด, ๊ธฐ๋ฅ, ์ฐฝ๋ฌธ ๋๋ ๋ณต์กํ ํ์ฌ๋ ํจํด๊ณผ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ๊ตฌ์กฐ ์์๋ฅผ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
- ๋์ ๊ณํ: ๊ฑด์ถ ๋ชจ๋ธ์ ์๋ฆฌ ํ์์ ๋๋ฌด, ๊ฐ๋ก๋ฑ ๋ฐ ์ฐจ๋์ ์ฑ์ ๊ท๋ชจ์ ํ๊ฒฝ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
-
์ธํฐ๋ํฐ๋ธ ์ ํ ๊ตฌ์ฑ๊ธฐ: ์๋์ฐจ, ๊ฐ๊ตฌ ๋๋ ํจ์
๊ณผ ๊ฐ์ด ๊ณ ๊ฐ์ด 3D๋ก ์ ํ์ ๋ง์ถค ์ค์ ํ๋ ์ฐ์
์ ๊ฒฝ์ฐ:
- ๋ถํ ๋ณํ: ์ ํ์ ์๋ ์๋ง์ ๋์ผํ ๋ถํ(์: ๋ณผํธ, ๋ฆฌ๋ฒณ, ๋ฐ๋ณต ํจํด)์ ํ์ํฉ๋๋ค.
- ๋๋ ์์ฐ ์๋ฎฌ๋ ์ด์ : ์ ํ์ด ๋๋์ผ๋ก ์ ์กฐ๋ ๋ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์๊ฐํํฉ๋๋ค.
-
์๋ฎฌ๋ ์ด์
๋ฐ ๊ณผํ ์ปดํจํ
:
- ์์ด์ ํธ ๊ธฐ๋ฐ ๋ชจ๋ธ: ๋ค์์ ๊ฐ๋ณ ์์ด์ ํธ(์: ์๋ผ, ๊ตํต ํ๋ฆ, ๊ตฐ์ค ์ญํ)์ ํ๋์ ์๋ฎฌ๋ ์ด์ ํ๋ฉฐ, ๊ฐ ์์ด์ ํธ๋ ์ธ์คํด์คํ๋ ์๊ฐ์ ํํ์ ๋๋ค.
- ์ ์ฒด ์ญํ: ์ ์ ๊ธฐ๋ฐ ์ ์ฒด ์๋ฎฌ๋ ์ด์ ์ ์๊ฐํํฉ๋๋ค.
์ด๋ฌํ ๊ฐ ๋ถ์ผ์์ WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ํ๋ถํ๊ณ ์ธํฐ๋ํฐ๋ธํ๋ฉฐ ๊ณ ์ฑ๋ฅ์ ์น ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์์ด ์ค์ํ ์ฅ๋ฒฝ์ ์ ๊ฑฐํฉ๋๋ค. ๋ค์ํ ํ๋์จ์ด์์ ๊ณ ๊ธ 3D ๋ ๋๋ง์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด, ๊ฐ๋ ฅํ ์๊ฐํ ๋๊ตฌ๋ฅผ ๋ฏผ์ฃผํํ๊ณ ๊ธ๋ก๋ฒ ๊ท๋ชจ์ ํ์ ์ ์ด์งํฉ๋๋ค.
๊ฒฐ๋ก
WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์น์์ ํจ์จ์ ์ธ 3D ๋ ๋๋ง์ ์ํ ์ด์ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ์๋ง์ ์ค๋ณต ๊ฐ์ฒด๋ฅผ ์ต์ ์ ์ฑ๋ฅ์ผ๋ก ๋ ๋๋งํ๋ ์ค๋ ๋ฌธ์ ๋ฅผ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํ์ฌ, ํ๋ ๋ณ๋ชฉ ํ์์ด์๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ผ๋ก ๋ณํํฉ๋๋ค. GPU์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํ์ฉํ๊ณ CPU-GPU ํต์ ์ ์ต์ํํจ์ผ๋ก์จ, ์ธ์คํด์ฑ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ์คํฌํฑ์์ ๋ชจ๋ฐ์ผ ํฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ฅ์น์์ ์ํํ๊ฒ ์คํ๋๋ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ์์ธํ๊ณ , ๊ด๋ฒ์ํ๋ฉฐ, ๋์ ์ธ ์ฅ๋ฉด์ ๋ง๋ค ์ ์๊ฒ ํ์ฌ ์ง์ ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ธต์ ๋ง์กฑ์ํฌ ์ ์์ต๋๋ค.
๊ดํํ ๊ฒ์ ์ธ๊ณ๋ฅผ ์ฑ์ฐ๊ณ ๋ฐฉ๋ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์๊ฐํํ๋ ๊ฒ๋ถํฐ ๋ณต์กํ ๊ฑด์ถ ๋ชจ๋ธ์ ์ค๊ณํ๊ณ ํ๋ถํ ์ ํ ๊ตฌ์ฑ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ด๋ฅด๊ธฐ๊น์ง, ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ์์ฉ ๋ถ์ผ๋ ๋ค์ํ๊ณ ์ํฅ๋ ฅ์ด ํฝ๋๋ค. ์ด ๊ธฐ์ ์ ์ฑํํ๋ ๊ฒ์ ๋จ์ํ ์ต์ ํ๊ฐ ์๋๋ผ, ์๋ก์ด ์ธ๋์ ๋ชฐ์ ํ ๊ณ ์ฑ๋ฅ ์น ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์๋๋ ฅ์ ๋๋ค.
์ํฐํ ์ธ๋จผํธ, ๊ต์ก, ๊ณผํ ๋๋ ์์ ์ ์ํด ๊ฐ๋ฐํ๋ , WebGL ์ง์ค๋ฉํธ๋ฆฌ ์ธ์คํด์ฑ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ ๋๊ตฌ ์์์์ ๊ท์คํ ์์ฐ์ด ๋ ๊ฒ์ ๋๋ค. ๋ ผ์๋ ๊ฐ๋ ๊ณผ ์ฝ๋ ์์ ๋ฅผ ์คํํ๊ณ ์์ ์ ํ๋ก์ ํธ์ ํตํฉํด ๋ณด์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ๊ณ ๊ธ ์น ๊ทธ๋ํฝ์ ์ฌ์ ์ ๋ณด๋ ์์ผ๋ฉฐ, ์ธ์คํด์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ํตํด ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๋ฌ์ฑํ ์ ์๋ ๊ฒ์ ์ ์ฌ๋ ฅ์ ๊ณ์ ํ์ฅ๋์ด ๋ชจ๋ ์ฌ๋, ๋ชจ๋ ๊ณณ์์ ์ธํฐ๋ํฐ๋ธ ๋์งํธ ์ฝํ ์ธ ์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๊ฐ๊ณ ์์ต๋๋ค.